home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / JFC.bin / MacProgressBarUI.java < prev    next >
Text File  |  1998-06-30  |  15KB  |  540 lines

  1. /*
  2.  * @(#)MacProgressBarUI.java    1.6 98/02/02
  3.  *
  4.  * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  *
  19.  */
  20.  
  21. package com.sun.java.swing.plaf.mac;
  22.  
  23. import java.awt.*;
  24. import com.sun.java.swing.*;
  25. import com.sun.java.swing.event.*;
  26. import com.sun.java.swing.plaf.*;
  27. import java.io.Serializable;
  28.  
  29. import com.sun.java.swing.plaf.basic.BasicProgressBarUI;
  30.  
  31.  
  32. /**
  33.  * A Mac ProgressBarUI.  
  34.  * <p>
  35.  * Warning: serialized objects of this class will not be compatible with
  36.  * future swing releases.  The current serialization support is appropriate
  37.  * for short term storage or RMI between Swing1.0 applications.  It will
  38.  * not be possible to load serialized Swing1.0 objects with future releases
  39.  * of Swing.  The JDK1.2 release of Swing will be the compatibility
  40.  * baseline for the serialized form of Swing objects.
  41.  *
  42.  * @version @(#)MacProgressBarUI.java    1.0 11/24/97
  43.  * @author Symantec
  44.  * @author David Bustin
  45.  */
  46. public class MacProgressBarUI extends BasicProgressBarUI
  47. {
  48.   private ImageIcon determHeadIcon;
  49.   private ImageIcon determLeftIcon;
  50.   private ImageIcon determTopIcon;
  51.   private ImageIcon determBottomIcon;
  52.  
  53.   private Color progressBarForeground;
  54.   private Color progressBarOuter5;
  55.   private Color progressBarOuterW;
  56.   private Color progressBarInner1;
  57.   private Color progressBarInner2;
  58.   private Color progressBarInner3;
  59.   private Color progressBarInner4;
  60.   private Color progressBarInner5;
  61.   private Color progressBarInner7;
  62.   private Color progressBarInner8;
  63.   private Color progressBarInner10;
  64.   private Color progressBarInner12;
  65.   private Color progressBarEdge;
  66.   private Color progressBarDisabledEdge;
  67.  
  68.   static protected final Dimension PREFERRED_INNER_HORIZONTAL 
  69.                                    = new Dimension(146, 14);
  70.   
  71.   static protected final Dimension PREFERRED_INNER_VERTICAL
  72.                                    = new Dimension(14, 146);
  73.  
  74.   // Space between border and progress bar
  75.   static protected final int BORDER_BUFFER = 0;
  76.  
  77.   static protected final int CELL_SPACING = 0;
  78.   static protected final int CELL_LENGTH = 4;
  79.   static protected final int LEFT_CELL_LENGTH = 4;
  80.   static protected final int CELL_HEIGHT = 4;
  81.   static protected final int BOTTOM_CELL_HEIGHT = 4;
  82.   
  83.   protected ActivationHelper activationHelper;
  84.   protected ChangeListener changeListener;
  85.   protected boolean isActive = true;
  86.  
  87.  
  88.     public boolean isActive()
  89.     {
  90.         return isActive;
  91.     }
  92.  
  93.     /**
  94.      * The default size of a horizontal progress bar
  95.      */
  96.     public Dimension getPreferredInnerHorizontal() {
  97.     return PREFERRED_INNER_HORIZONTAL;
  98.     }
  99.  
  100.     /**
  101.      * The default size of a vertical progress bar
  102.      */
  103.     public Dimension getPreferredInnerVertical() {
  104.     return PREFERRED_INNER_VERTICAL;
  105.     }
  106.  
  107.     /**
  108.      * Don't leave space between the interior and the border
  109.      */
  110.     public int getBorderBuffer() {
  111.     return BORDER_BUFFER;
  112.     }
  113.  
  114.     /**
  115.      * The default length of a cell
  116.      */
  117.     public int getCellLength() {
  118.     return CELL_LENGTH;
  119.     }
  120.  
  121.     /**
  122.      * Don't leave any gap between cells
  123.      */
  124.     public int getCellSpacing() {
  125.     return CELL_SPACING;
  126.     }
  127.   
  128.   public static ComponentUI createUI(JComponent c) {
  129.     return new MacProgressBarUI();
  130.   }
  131.   
  132.   public void installUI(JComponent c) {
  133.     super.installUI(c);
  134.  
  135.     determHeadIcon = (ImageIcon)UIManager.getIcon("ProgressBar.determHead");
  136.     determLeftIcon = (ImageIcon)UIManager.getIcon("ProgressBar.determLeft");
  137.     determTopIcon = (ImageIcon)UIManager.getIcon("ProgressBar.determTop");
  138.     determBottomIcon = (ImageIcon)UIManager.getIcon("ProgressBar.determBottom");
  139.     
  140.     AppearanceFilter.FilterImageIcon(c,determHeadIcon);
  141.     AppearanceFilter.FilterImageIcon(c,determLeftIcon);
  142.     AppearanceFilter.FilterImageIcon(c,determTopIcon);
  143.     AppearanceFilter.FilterImageIcon(c,determBottomIcon);
  144.     
  145.     progressBarForeground = UIManager.getColor("ProgressBar.foreground");
  146.     progressBarOuter5 = UIManager.getColor("ProgressBar.outer5");
  147.     progressBarOuterW = UIManager.getColor("ProgressBar.outerW");
  148.     progressBarInner1 = AppearanceFilter.FilterColor(UIManager.getColor("ProgressBar.inner1"));
  149.     progressBarInner2 = AppearanceFilter.FilterColor(UIManager.getColor("ProgressBar.inner2"));
  150.     progressBarInner3 = AppearanceFilter.FilterColor(UIManager.getColor("ProgressBar.inner3"));
  151.     progressBarInner4 = AppearanceFilter.FilterColor(UIManager.getColor("ProgressBar.inner4"));
  152.     progressBarInner5 = AppearanceFilter.FilterColor(UIManager.getColor("ProgressBar.inner5"));
  153.     progressBarInner7 = AppearanceFilter.FilterColor(UIManager.getColor("ProgressBar.inner7"));
  154.     progressBarInner8 = AppearanceFilter.FilterColor(UIManager.getColor("ProgressBar.inner8"));
  155.     progressBarInner10 = AppearanceFilter.FilterColor(UIManager.getColor("ProgressBar.inner10"));
  156.     progressBarInner12 = AppearanceFilter.FilterColor(UIManager.getColor("ProgressBar.inner12"));
  157.     progressBarEdge = UIManager.getColor("ProgressBar.edge");
  158.     progressBarDisabledEdge = UIManager.getColor("ProgressBar.disabledEdge");
  159.   }
  160.   
  161.  
  162.   public void paint(Graphics g, JComponent c) {
  163.  
  164.     Dimension size = c.getSize();
  165.     int x, y;
  166.     int span;
  167.     JProgressBar progressBar = (JProgressBar)c;
  168.     BoundedRangeModel model = progressBar.getModel();
  169.     Insets b = getBorderInsets(c);
  170.     boolean enabled = c.isEnabled();
  171.    
  172.     span = model.getMaximum() - model.getMinimum();
  173.       
  174.     if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) 
  175.     {
  176.     if (size.height > PREFERRED_INNER_HORIZONTAL.height)
  177.     {
  178.         size.height = PREFERRED_INNER_HORIZONTAL.height;
  179.     }
  180.     int increment = CELL_LENGTH + CELL_SPACING;
  181.     x = b.left;
  182.     y = b.top;
  183.     int length = (span != 0) ? size.width*model.getValue()/span : 0;
  184.     length = length - length % CELL_LENGTH;    // Round to Cell Length
  185.     int max = x + length;
  186.     if (enabled && isActive)
  187.         max -= LEFT_CELL_LENGTH;
  188.     else
  189.         max -= 2;
  190.     int start = max;
  191.  
  192.     if (start < 0)
  193.         {
  194.         start = 0;
  195.         max = 0;
  196.         }
  197.  
  198.     if (enabled && isActive)
  199.         {
  200.         g.setColor(progressBarOuter5);
  201.         g.drawLine(0, 0, 0, size.height-2);
  202.         g.drawLine(0, 0, size.width-2, 0);
  203.         g.setColor(progressBarEdge);
  204.         }
  205.     else
  206.         {
  207.         g.setColor(progressBarDisabledEdge);
  208.         }
  209.  
  210.     g.drawRect(1, 1, size.width-3, size.height-3);
  211.         
  212.     if (enabled && isActive)
  213.         {
  214.         g.setColor(progressBarInner7);
  215.         g.drawLine(start + 2, 2, size.width-3, 2);
  216.             
  217.         g.setColor(progressBarInner2);
  218.         g.drawLine(size.width-3, 2, size.width-3, size.height-3);
  219.         g.drawLine(start + 2, size.height-3, size.width-3, size.height-3);
  220.  
  221.         if (progressBar.isOpaque())
  222.             {
  223.             g.setColor(progressBarInner4);
  224.             g.fillRect(start+2, 3, size.width-2-start-2, size.height-6);
  225.             }
  226.         else
  227.             g.clearRect(start+2, 3, size.width-2-start-2, size.height-6);
  228.  
  229.         g.setColor(progressBarOuterW);
  230.         g.drawLine(size.width-1, 0, size.width-1, size.height-1);
  231.         g.drawLine(1, size.height-1, size.width-1, size.height-1);
  232.         }
  233.     else
  234.         {
  235.         if (progressBar.isOpaque())
  236.             {
  237.             g.setColor(progressBarInner4);
  238.             g.fillRect(start+2, 2, size.width-2-start-2, size.height-4);
  239.             }
  240.         else
  241.             g.clearRect(start+2, 2, size.width-2-start-2, size.height-4);
  242.         g.setColor(c.getParent().getBackground());
  243.         g.drawRect(0, 0, size.width-1, size.height-1);
  244.         }
  245.     
  246.     // Draw constant left cell
  247.     if (model.getValue() != 0) 
  248.         {
  249.         if (enabled && isActive)
  250.             {
  251.             g.setColor(progressBarInner8);
  252.             g.drawLine(2, 2, 2, size.height-3);
  253.             determLeftIcon.paintIcon(progressBar, g, x + 3, y + 2);
  254.             }
  255.         else
  256.             {
  257.             g.setColor(progressBarInner5);
  258.             g.fillRect(x + 2, 2, 3, size.height-4);
  259.             }
  260.         }
  261.  
  262.     int left;
  263.     if (enabled && isActive)
  264.         left = x + LEFT_CELL_LENGTH;
  265.     else
  266.         left = x + 2;
  267.     if (max > left)
  268.         {
  269.         if (enabled && isActive)
  270.             {
  271.             g.setColor(progressBarEdge);
  272.             g.drawLine(left,y+1,max,y+1);
  273.             g.drawLine(left,y+12,max,y+12);
  274.             g.setColor(progressBarInner10);
  275.             g.drawLine(left,y+2,max,y+2);
  276.             g.drawLine(left,y+10,max,y+10);
  277.             g.setColor(progressBarInner8);
  278.             g.drawLine(left,y+3,max,y+3);
  279.             g.drawLine(left,y+9,max,y+9);
  280.             g.setColor(progressBarOuter5);
  281.             g.drawLine(left,y,max,y);
  282.             g.drawLine(left,y+4,max,y+4);
  283.             g.drawLine(left,y+8,max,y+8);
  284.             g.setColor(progressBarInner3);
  285.             g.drawLine(left,y+5,max,y+5);
  286.             g.drawLine(left,y+7,max,y+7);
  287.             g.setColor(progressBarInner1);
  288.             g.drawLine(left,y+6,max,y+6);
  289.             g.setColor(progressBarInner12);
  290.             g.drawLine(left,y+11,max,y+11);
  291.             g.setColor(progressBarOuterW);
  292.             g.drawLine(left,y+13,max,y+13);
  293.             }
  294.         else
  295.             {
  296.             g.setColor(progressBarInner5);
  297.             g.fillRect(left,y+2,max-left+3,10);
  298.             }
  299.         }
  300.  
  301.     g.setColor(progressBarForeground);
  302.      
  303.     if (model.getValue() != 0) 
  304.         {
  305.         // Draw the head cell
  306.         if (model.getValue() == model.getMaximum()) 
  307.             {
  308.             if (enabled && isActive)
  309.                 {
  310.                 g.setColor(progressBarForeground);
  311.                 determHeadIcon.paintIcon(progressBar, g, size.width - 6, y + 2);
  312.                 g.setColor(progressBarEdge);
  313.                 g.drawLine(size.width-2, 1, size.width-2, size.height-2);
  314.                 g.setColor(progressBarOuterW);
  315.                 g.drawLine(size.width-1, 0, size.width-1, size.height-1);
  316.                 }
  317.              else
  318.                 {
  319.                 g.setColor(progressBarDisabledEdge);
  320.                 g.drawLine(size.width-2,y+1,size.width-2,y+11);
  321.                 }
  322.             }
  323.         else
  324.             {
  325.              if (enabled && isActive)
  326.                    determHeadIcon.paintIcon(progressBar, g, max, y + 2);
  327.              else
  328.                 {
  329.                 g.setColor(progressBarDisabledEdge);
  330.                 g.drawLine(max+3,y+1,max+3,y+11);
  331.                 }
  332.             }
  333.            }
  334.     } 
  335.     else     // Vertical Bar section drawn from bottom to top
  336.     {
  337.     if (size.width > PREFERRED_INNER_VERTICAL.width)
  338.     {
  339.         size.width = PREFERRED_INNER_VERTICAL.width;
  340.     }
  341.     x = b.left;
  342.     y = b.top;
  343.     int height = (span != 0) ? size.height*model.getValue()/span : 0;
  344.     height = height - height % CELL_HEIGHT;    // Round to Cell Height
  345.     int bottom = y + size.height - height - BOTTOM_CELL_HEIGHT;
  346.  
  347.     if (bottom < 0)
  348.         bottom = 0;
  349.  
  350.     int start = bottom;
  351.  
  352.     if (enabled && isActive)
  353.         {
  354.         g.setColor(progressBarOuter5);
  355.         g.drawLine(0, size.height-1, size.width-1, size.height-1);
  356.         g.drawLine(0, 1, 0, size.height-2);
  357.         g.setColor(progressBarEdge);
  358.         }
  359.     else
  360.         {
  361.         g.setColor(progressBarDisabledEdge);
  362.         }
  363.  
  364.     g.drawRect(1, 1, size.width-3, size.height-3);
  365.  
  366.     if (enabled && isActive)
  367.         {
  368.         g.setColor(progressBarInner7);
  369.         g.drawLine(2, 2, 2, start+1);
  370.     
  371.         g.setColor(progressBarInner2);
  372.         g.drawLine(3, 2, size.width-3, 2);
  373.         g.drawLine(size.width-3, 3, size.width-3, start+1);
  374.     
  375.         if (progressBar.isOpaque())
  376.             {
  377.             g.setColor(progressBarInner4);
  378.             g.fillRect(3, 3, size.width-6, start-1);
  379.             }
  380.         else
  381.             g.clearRect(3, 3, size.width-6, start-1);
  382.     
  383.         g.setColor(progressBarOuterW);
  384.         g.drawLine(0, 0, size.width-1, 0);
  385.         g.drawLine(size.width-1, 1, size.width-1, size.height-2);
  386.         }
  387.     else
  388.         {
  389.         if (progressBar.isOpaque())
  390.             {
  391.             g.setColor(progressBarInner4);
  392.             g.fillRect(2, 2, size.width-4, start);
  393.             }
  394.         else
  395.             g.clearRect(2, 2, size.width-4, start);
  396.         g.setColor(c.getParent().getBackground());
  397.         g.drawRect(0, 0, size.width-1, size.height-1);
  398.         }    
  399.         
  400.     // Draw constant bottom cell
  401.     if (model.getValue() != 0) 
  402.         {
  403.         if (enabled && isActive)
  404.             {
  405.             g.setColor(progressBarInner8);
  406.             g.drawLine(2, size.height-3, size.width-3, size.height-3);
  407.             determBottomIcon.paintIcon(progressBar, g, x+2, size.height-4);
  408.             }
  409.         else
  410.             {
  411.             g.setColor(progressBarInner5);
  412.             g.fillRect(2, size.height-4, size.width-4, 2);
  413.             }
  414.         }
  415.         
  416.     int end = size.height - BOTTOM_CELL_HEIGHT;
  417.  
  418.     if (bottom < end)
  419.         {
  420.         if (enabled && isActive)
  421.             {
  422.             g.setColor(progressBarEdge);
  423.             g.drawLine(x+1,bottom,x+1,end);
  424.             g.drawLine(x+12,bottom,x+12,end);
  425.             g.setColor(progressBarInner10);
  426.             g.drawLine(x+2,bottom,x+2,end);
  427.             g.drawLine(x+10,bottom,x+10,end);
  428.             g.setColor(progressBarInner8);
  429.             g.drawLine(x+3,bottom,x+3,end);
  430.             g.drawLine(x+9,bottom,x+9,end);
  431.             g.setColor(progressBarOuter5);
  432.             g.drawLine(x,bottom,x,end);
  433.             g.drawLine(x+4,bottom,x+4,end);
  434.             g.drawLine(x+8,bottom,x+8,end);
  435.             g.setColor(progressBarInner3);
  436.             g.drawLine(x+5,bottom,x+5,end);
  437.             g.drawLine(x+7,bottom,x+7,end);
  438.             g.setColor(progressBarInner1);
  439.             g.drawLine(x+6,bottom,x+6,end);
  440.             g.setColor(progressBarInner12);
  441.             g.drawLine(x+11,bottom,x+11,end);
  442.             g.setColor(progressBarOuterW);
  443.             g.drawLine(x+13,bottom,x+13,end);
  444.             }
  445.         else
  446.             {
  447.             g.setColor(progressBarInner5);
  448.             g.fillRect(x+2,bottom+2,x+10,end-bottom-2);
  449.             }
  450.         }
  451.  
  452.      
  453.     if (model.getValue() != 0) 
  454.         {
  455.         // Draw the top cell
  456.         if (model.getValue() == model.getMaximum()) 
  457.             {
  458.             if (enabled && isActive)
  459.                 {
  460.                 g.setColor(progressBarForeground);
  461.                    determTopIcon.paintIcon(progressBar, g, x+2, 0);
  462.                 }
  463.              else
  464.                 {
  465.                 g.setColor(progressBarDisabledEdge);
  466.                 g.drawLine(x+2,1,11,1);
  467.                 }
  468.               }
  469.           else
  470.             {
  471.              if (enabled && isActive)
  472.                    determTopIcon.paintIcon(progressBar, g, x+2, bottom);
  473.              else
  474.                 {
  475.                 g.setColor(progressBarDisabledEdge);
  476.                 g.drawLine(x+2,bottom+2,11,bottom+2);
  477.                 }
  478.                }
  479.            }
  480.  
  481.     if (enabled && isActive)
  482.         {
  483.          g.setColor(progressBarEdge);
  484.         g.drawLine(1,1, size.width-2, 1);
  485.         g.setColor(progressBarOuterW);
  486.         g.drawLine(0,0, size.width-1, 0);
  487.         }
  488.     else
  489.         {
  490.          g.setColor(progressBarDisabledEdge);
  491.         g.drawLine(1,1, size.width-2, 1);
  492.         }
  493.     }
  494.   }
  495.   
  496.     public Insets getBorderInsets(JComponent c) 
  497.     {
  498.         // no borders on MacProgressBar
  499.         return new Insets(0, 0, 0, 0);
  500.     }
  501.  
  502.     protected void installListeners(JComponent c)
  503.     {
  504.         super.installListeners(c);
  505.         
  506.         activationHelper    = new ActivationHelper(c);
  507.         changeListener        = new ChangeListener();
  508.         activationHelper.addPropertyChangeListener(changeListener);
  509.     }
  510.     
  511.     protected void uninstallListeners(JComponent c)
  512.     {
  513.         super.uninstallListeners(c);
  514.         activationHelper.removePropertyChangeListener(changeListener);
  515.         activationHelper = null;
  516.         changeListener = null;
  517.     }
  518.     
  519.     class ChangeListener implements java.beans.PropertyChangeListener
  520.     {
  521.         public void propertyChange(java.beans.PropertyChangeEvent evt)
  522.         {
  523.             if(evt.getPropertyName().equals("activated"))
  524.             {
  525.                 boolean oldActive = isActive;
  526.                 isActive = ((Boolean) evt.getNewValue()).booleanValue();
  527.                 if(isActive != oldActive)
  528.                 {
  529.                     Object obj = evt.getSource();
  530.                     if(obj instanceof ActivationHelper)
  531.                     {
  532.                         ((ActivationHelper)obj).getComponent().repaint();
  533.                     }
  534.                 }
  535.             }
  536.         }
  537.     }
  538. }
  539.  
  540.